#ifndef __I_GAME_SCENE_MANAGER_H_INCLUDED__
#define __I_GAME_SCENE_MANAGER_H_INCLUDED__
#include "IUnknown.h"
#include "SActionEventArgs.h"
#include "irrString.h"
#include "irrMonitor.h"
#include "ISceneManager.h"
#include "IGameScene.h"

namespace game
{
	namespace scene
	{
		class IDynamicObject;
		class ILocationObject;

		//! Base class for scene object.
		class IGameSceneManager : public irr::IUnknown
		{
		public:
			
			virtual ~IGameSceneManager()
			{
			}

			virtual IGameScene* getCurrentGameScene() = 0;

			virtual void setCurrentGameScene(IGameScene* value) = 0;
			
			//! Register GameScene types for deserialize it
			virtual void registerGameSceneType(const c8* typeName, delegateGameSceneCreator* gameSceneCreator) = 0;

			//! Load GameScene from xml file
			virtual IGameScene* getGameScene(const c8* fileName) = 0;

			//! Load IDynamicObject from xml file and set his type. If you want get static scene object - use this function, but not use animation features.
			virtual IDynamicObject* getDynamicObject(const c8* fileName,  EGAME_OBJECT_TYPE type) = 0;

			//! Load location object from xml file. If you want load world just use this func, but set type "world"
			virtual ILocationObject* getLocationObject(const c8* fileName) = 0;

			//! Need fires when user make action
			virtual bool onUserAction(SUserAction action) = 0;
			
			virtual bool onNetworkRequest(void* data) = 0;

			//! Gets scene manager
			virtual irr::scene::ISceneManager* getSceneManager() = 0;

			virtual video::IVideoHandler* getVideoHandler() = 0;

		protected:

			//! Fires when scene was change
			virtual void onChangeScene(EventArgs e) = 0;
		};
	}
}
#endif